package org.examples.java.lang;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;

import org.junit.Test;

public class ByteTest {

    private boolean sdk6 = System.getProperty("java.version").startsWith("1.6");
    
    @Test
    public void testConstructor() throws Exception
    {
        Byte byte1 = new Byte((byte)120);
        Byte byte2 = 120;
        Byte byte3 = new Byte("120");

        assertEquals(byte1, byte2);
        assertEquals(byte1, byte3);
        assertNotSame(byte1, byte2);
        assertNotSame(byte1, byte3);
        assertEquals(new Byte("0"), new Byte("-0"));
        assertEquals(new Byte("127"), new Byte((byte)127));
    }

    @Test
    public void testEqualsHashCode() throws Exception
    {
        Byte byte1 = new Byte((byte) -120);
        Byte byte2 = -120;

        assertTrue(byte1.equals(byte2));
        assertTrue(byte1.equals(byte2));
        assertFalse(Integer.valueOf( -120).equals(byte1));
        assertEquals( -120, byte1.hashCode());
    }

    @Test
    public void testParseByte() throws Exception
    {
        assertTrue(Byte.parseByte("127") == 127);
        assertTrue(Byte.parseByte("-128") == -128);
        assertTrue(Byte.parseByte("-128", 10) == -128);
        assertTrue(Byte.parseByte("-10", 16) == -16);
        assertTrue(Byte.parseByte("A", 16) == 10);
        assertTrue(Byte.parseByte("a", 16) == 10);
        assertTrue(Byte.parseByte("00000a", 16) == 10);
    }

    @Test
    public void testValueOf() throws Exception
    {
        assertEquals(Byte.valueOf((byte)120), Byte.valueOf("120"));
        assertSame(Byte.valueOf((byte)120), Byte.valueOf((byte)120));
        if (sdk6) {
            assertNotSame(Byte.valueOf((byte)120), Byte.valueOf("120"));
            assertNotSame(Byte.valueOf("120"), Byte.valueOf("120"));
            assertNotSame(Byte.valueOf("120", 10), Byte.valueOf("120", 10));
        } else {
            assertSame(Byte.valueOf((byte)120), Byte.valueOf("120"));
            assertSame(Byte.valueOf("120"), Byte.valueOf("120"));
            assertSame(Byte.valueOf("120", 10), Byte.valueOf("120", 10));
        }
    }

    @Test
    public void testValues() throws Exception
    {
        Byte byte1 = Byte.valueOf((byte)120);
        assertTrue(byte1.intValue() == 120);
        assertTrue(byte1.longValue() == 120);
        assertTrue(byte1.doubleValue() == 120.0);
        assertTrue(byte1.shortValue() == 120);
        assertTrue(byte1.floatValue() == 120.0);
        assertTrue(byte1.byteValue() == 120);
        assertEquals("120", byte1.toString());
        assertEquals("-7", Byte.valueOf((byte) -7).toString());
        assertEquals("-7", Byte.toString((byte) -7));
    }

    @Test
    public void testDecode() throws Exception
    {
        assertEquals(new Byte((byte)15), Byte.decode("0xF"));
        assertEquals(new Byte((byte)15), Byte.decode("#F"));
        assertEquals(new Byte((byte)127), Byte.decode("#7F"));
        assertEquals(new Byte((byte)8), Byte.decode("010"));
        assertEquals(new Byte((byte)10), Byte.decode("10"));
    }

    @Test
    public void testCompareTo() throws Exception
    {
        assertEquals(0, new Byte((byte)15).compareTo(Byte.valueOf((byte)15)));
        assertEquals(-3, new Byte((byte)12).compareTo(Byte.valueOf((byte)15)));
        assertEquals(3, new Byte((byte)15).compareTo(Byte.valueOf((byte)12)));
    }
}
